/******************************************************************************
 * Arquivo: VerificadorVeiculoCerca.java                                                           *
 * Autor: Aurindo Jorge Ferreira                                              *
 * e-mail: aurindo@gmail.com                                                  *
 * Data de cria��o: 09/12/2007                                                   *
 *                                                                            *
 * Propriedade de FastFind Solu��es Tecnologicas                              *
 ******************************************************************************/

package br.com.srv.util.geometriaanalitica;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import br.com.srv.componentes.cerca.util.PontosTOComparator;
import br.com.srv.model.CercaTO;
import br.com.srv.model.PontoTO;

public class VerificadorVeiculoPoligono {

	public boolean verificarVeiculoInCerca(CercaTO cercaTO, PontoTO pontoTO)
		throws NumberFormatException, Exception {
		
		PontoTO[] pontos = (PontoTO[])cercaTO.getPontos().toArray();
		
		List<PontoTO> pontosOrdenados = new ArrayList<PontoTO>();
		pontosOrdenados.addAll(cercaTO.getPontos());
		
		Collections.sort(pontosOrdenados, new PontosTOComparator());
		
		boolean result = contem(pontoTO, pontosOrdenados);
		
		System.out.println(result);
		
		return true;
	}
	
	public boolean contem(PontoTO pontoTO, List<PontoTO> points) {
        int crossings = 0;
        int N = points.size();
        for (int i = 0; i < N-1; i++) {
            double slope = (points.get(i+1).getLongitude() - points.get(i).getLongitude())  / (points.get(i+1).getLatitude() - points.get(i).getLatitude());
            boolean cond1 = (points.get(i).getLatitude() <= pontoTO.getLatitude()) && (pontoTO.getLatitude() < points.get(i+1).getLatitude());
            boolean cond2 = (points.get(i+1).getLatitude() <= pontoTO.getLatitude()) && (pontoTO.getLatitude() < points.get(i).getLatitude());
            boolean cond3 = pontoTO.getLongitude() <  slope * (pontoTO.getLatitude() - points.get(i).getLatitude()) + points.get(i).getLongitude();
            if ((cond1 || cond2) && cond3) crossings++;
        }
        return (crossings % 2 != 0);	    
	}
	
}
